/**
 * 页面基类 => 高阶组件
 */

import Taro from '@tarojs/taro'
import { waitAppInit, goToErrorPage, awtAsyncFunc } from '../../utils/index'
import Store from '../../store/index'
import { IBasePage } from '../../interfaces/basePage'

const UseBasePage = () => {  
  // 初始化流程
  const onload = async (callback, pageTitle) => {
    // 等待程序初始化完成
    let initRs: IBasePage['initRs'] = await waitAppInit()
    // 程序初始化失败，不再向下执行
    if (!initRs) return 'stop'
    // 页面逻辑加载
    let pageRs: IBasePage['pageRs'] = await callback().catch(ex => {
      // 页面加载失败
      Store.isInit = true
      console.log('页面加载失败:', ex)
      goToErrorPage(500)
      return true
    })
    Taro.hideLoading()
    if (pageRs) {
      Store.isInit = true
    } else {
      Store.pageIsReady = true
      Taro.setNavigationBarTitle({
        title: pageTitle
      })
    }
  }
  // 统一异常拦截，所有异步方法使用这个进行统一处理
  const awtRs = async asyncFunc => {
    let apiRes: IBasePage['apiRes'] = await awtAsyncFunc(asyncFunc).catch(ex => {
      Taro.showToast({
        title: '系统开⼩差了，程序员⼩哥正在抢修中'
      })
      throw ex
    })
    // 非200状态码处理
    if (apiRes && apiRes.next && apiRes.httpCode && apiRes.httpCode !== 200) {
      apiRes.next = false
      if (!Store.pageIsReady) {
        // 非200 页面问题
        goToErrorPage(apiRes.httpCode)
      } else {
        // 非200 操作问题
        switch (apiRes.httpCode) {
          case 400:
            Taro.showToast({
              title: '参数校验错误：' + apiRes.msg
            })
            break
          case 404:
            Taro.showToast({
              title: '请求错误，请稍后再试'
            })
            break
          case 500:
              Taro.showToast({
                title: '系统开⼩差了，程序员⼩哥正在抢修中'
              })
              break
          case 502:
          case 503:
          case 504:
            Taro.showToast({
              title: '网络不给力，请稍后再试'
            })
            break
          case 506:
            Taro.showToast({
              title: '网络异常，断网了'
            })
          default:
            Taro.showToast({
              title: apiRes.msg || ''
            })
        }
      }
    }
    return apiRes
  }

  return {
    onload,
    awtRs
  }
}

export default UseBasePage

